﻿define([
    "jquery",
    "oms_config/root",
    "oms_vm/navbar",
    "oms_vm/error",
    "comm/toast/toast",
    "comm/page/page",
    "comm/simple/simple",
    "comm/print/print",
    "comm/code/code"
],
    function ($, $root, $navbar, $error, $toast, $page, $simple, $print, $code) {
        var bb = {}
        var defaults = {
            url: {
                // followup: "http://120.26.111.12:8082/",
                followup: "/",
                department: "/",
                nutrition: "/",
                assess: "/",
                imgCollection: "/",
                followapp: "/followapp/",
                blood: "/distreat/",
                // scale: "http://localhost:8081/nirn/paper/index.html",
                // scaleHost: "http://127.0.0.1:83/nirn/"
                scale: "http://local.huerai.com:10020/index.html",
                scaleHost: "http://local.huerai.com:10062/nirn/"
            },

            // url: {
            // 	followup: "http://doctortest.bb-care.com:8200/",
            //     // followup: "http://192.168.3.138:8090/",
            //     followapp: "http://192.168.1.138/",
            //     department: "http://doctortest.bb-care.com:8200/",
            //     nutrition: "http://doctortest.bb-care.com:8200/",
            //     assess: "http://121.43.227.180/",
            //     imgCollection: "http://121.43.227.180/",
            //     followapp: "http://121.43.227.180/followapp/",
            //     blood: "http://192.168.1.138:8080/distreat/",
            // 	scale: ""
            // },
            link: {
                monthlyAssessReport: "http://doctor.bb-care.com:9090/wechat/html/babyEvaluate/history/analysis.html"
            }
        }

        // 所有的 input type="date" 设置最大日期
        $('body').on('click', 'input[type=date]', function () {
            $(this).attr('max', '2999-01-01')
        })


        /**
         * 根据网页链接的名称(名称是自定义的)获取生成的网页链接
         */
        bb.link = function (linkName) {
            return defaults.link[linkName]
        }

        /**
         * 根据应用名称获取应用服务器地址
         */
        bb.baseUrl = function (appName) {
            return defaults.url[appName]
        }

        /**
         * 封装Ajax Get请求
         * 参数与jQuery get一致
         */
        bb.get = function (url, data, callback) {
            var sid = checkSession()
            var url = addSessionId(url, sid)
            return $.get(url, data, callback)
        }

        /**
         * 封装Ajax Post请求
         * 参数与jQuery post一致
         */
        bb.post = function (url, data, callback) {
            var sid = checkSession()
            var url = addSessionId(url, sid)
            return $.post(url, data, callback)
        }

        /**
         * 封装Ajax请求
         * 参数与jQuery ajax一致
         */
        bb.ajax = function (params) {
            params = getAjaxParams(params)
            var sid = checkSession()
            params.url = addSessionId(params.url, sid)
            return $.ajax(params)
        }

        /**
         * 选中一个导航菜单并打开导航页面
         * param:
         * 	name:导航菜单的名称
         */
        bb.selectNavbar = function (name, params, config) {
            $navbar.select(name, config)
            if (params) {
                $('#content-main').data("params", params)
            }
        }

        /**
         * 打开一个新页面，但导航菜单保持不变
         * param:
         * 	name:导航菜单的名称
         */
        bb.openPage = function (name, params, config) {
            $navbar.openPage(name, config)
            // console.log("config",config)
            if (params) {
                $('#content-main').data("params", params)
            }
        }

        /**
         * 打开一个新页面
         * param:
         * id:租户下导航菜单的id
         */
        bb.fopen = function (id, params) {
            $navbar.fopen(id)
            if (params) {
                $('#content-main').data("params", params)
            }
        }
        /**
         * 打开一个新页面
         * params.btn 配置在auth表里的参数
         * domId 点击的按钮的id或者className
         * name 页面的资源name
         * arg 页面传递的参数
         */
        bb.open = function (params, domId, name, arg) {
            if (params && params.btn && typeof params.btn == "object") {
                if ($.isArray(params.btn)) {
                    for (var i = 0; i < params.btn.length; i++) {
                        if (params.btn[i].domId == domId) {
                            bb.fopen(params.btn[i].authId, arg)
                        }
                    }
                    bb.openPage(name, arg)
                } else {
                    if (params.btn.domId == domId) {
                        bb.fopen(params.btn.authId, arg)
                    } else {
                        bb.openPage(name, arg)
                    }
                }
            } else {
                bb.openPage(name, arg)
            }
        }

        /**
         * 获取当前页面的参数
         */
        bb.getPageParams = function () {
            return $('#content-main').data("params")
        }

        /**
         * 获取当前的 租户信息
         * @return {[object]} [返回租户的相关信息，其中就有tenantId]
         */
        bb.getTenant = function () {
            if (bb.getSessionStorage("account")) {
                var account = JSON.parse(bb.getSessionStorage("account"))
                for (var i = 0; i < account.apps.length; i++) {
                    if (account.apps[i].status == 1) {
                        return account.apps[i]
                    }
                }
            }
        }

        /**
         * 获取当前的 项目信息
         * @return {[object]} [返回项目的相关信息，其中就有projectId]
         */
        bb.getProiect = function () {
            if (bb.getSessionStorage("account")) {
                var account = JSON.parse(bb.getSessionStorage("account"))
                for (var i = 0; i < account.apps.length; i++) {
                    if (account.apps[i].status == 1) {
                        for (var j = 0; j < account.apps[i].auProjectRoleRel.length; j++) {
                            if (account.apps[i].auProjectRoleRel[j].selectStatus == 1) {
                                return account.apps[i].auProjectRoleRel[j]
                            }
                        }
                    }
                }
            }
        }

        /**
         * 获取渠道编码 channelId
         */
        bb.getChannelId = function () {
            return bb.getTenant().tenantId + "※" + bb.getProiect().projectId
        }

        /**
         * 检查本地session情况
         */
        var checkSession = function () {
            var sid = sessionStorage.sessionId
            var time = sessionStorage.sessionTime
            var currTime = new Date().getTime()
            if (!sid || !time || (currTime - time > 1800000)) {
                var config = $root.init()
                window.location.href = config.route.login
            }
            sessionStorage.sessionTime = currTime
            return sid
        }

        /**
         * Ajax请求添加sessionId
         */
        var addSessionId = function (url, sid) {
            if (url.indexOf("?") > -1) {
                url = url + "&sessionId=" + sid
            } else {
                url = url + "?sessionId=" + sid
            }
            return url
        }

        /**
         * 继承ajax请求的默认参数
         */
        var getAjaxParams = function (params) {
            var defaultParams = {
                type: "post",
                contentType: "application/json;charset=UTF-8",
                //crossDomain: true,
                /*headers: {
                "sessionId":sessionStorage.sessionId,
                "Accept":"application/json;charset=UTF-8",
            },*/
                /*beforeSend: function(req) {
                    req.setRequestHeader('sessionId',sessionStorage.sessionId);
                }, */
                dataType: "json",
                data: JSON.stringify({
                    data: {}
                }),
                error: function (data) {
                    $error.handle(data.status, data.msg, $toast.show)
                }
            }
            return $.extend(defaultParams, params)
        }

        /**
         * toast提示框
         */
        bb.toastShow = function (msg, time, callback, params) {
            $toast.show(msg, time, callback, params)
        }
        bb.toastClose = function () {
            $toast.close()
        }

        /**
         * toast 确认提示框
         */
        bb.toastConfirmShow = function (callback, params, tip) {
            $toast.confirm(callback, params, tip)
        }

        /**
         * 模态框
         */
        bb.modal = function (options, callback) {
            $toast.modal(options, callback)
        }

        /**
         * 设置cookie
         */
        var setCookie = function (name, value, seconds) {
            seconds = seconds || 0 //seconds有值就直接赋值，没有为0，
            var expires = ""
            if (seconds != 0) { //设置cookie生存时间
                var date = new Date()
                date.setTime(date.getTime() + (seconds * 1000))
                expires = "; expires=" + date.toGMTString()
            }
            document.cookie = name + "=" + escape(value) + expires + "; path=/" //转码并赋值
        }

        /**
         * 获取cookie
         */
        var getCookie = function (name) {
            var nameEQ = name + "="
            var ca = document.cookie.split(';') //把cookie分割成组
            for (var i = 0; i < ca.length; i++) {
                var c = ca[i] //取得字符串
                while (c.charAt(0) == ' ') { //判断一下字符串有没有前导空格
                    c = c.substring(1, c.length) //有的话，从第二位开始取
                }
                if (c.indexOf(nameEQ) == 0) { //如果含有我们要的name
                    return unescape(c.substring(nameEQ.length, c.length)) //解码并截取我们要值
                }
            }
            return false
        }

        /**
         * 设置localStorage
         */
        bb.setIocalStorage = function (key, value) {
            if (localStorage) {
                localStorage.setItem(key, value)
            } else if (navigator.cookieEnabled) {
                setCookie(key, value, 2592000) //cookie的生存时间30天 = 2592000秒
            } else {
                this.toastShow("您的浏览器不支持localStorage和cookie，请更新换更换浏览器！")
            }
        }

        /**
         * 获取localStorage
         */
        bb.getIocalStorage = function (key) {
            var data
            if (localStorage) {
                data = localStorage.getItem(key)
            } else if (navigator.cookieEnabled) {
                data = getCookie(key)
            } else {
                this.toastShow("您的浏览器不支持localStorage和cookie，<br>请更新换更换浏览器！")
            }
            return data
        }

        /**
         * 设置sessionStorage
         */
        bb.setSessionStorage = function (key, value) {
            if (sessionStorage) {
                sessionStorage.setItem(key, value)
            } else {
                this.toastShow("您的浏览器不支持sessionStorage，<br>请更新换更换浏览器！")
            }
        }

        /**
         * 获取sessionStorage
         */
        bb.getSessionStorage = function (key) {
            var data
            if (sessionStorage) {
                data = sessionStorage.getItem(key)
            } else {
                this.toastShow("您的浏览器不支持sessionStorage，<br>请更新换更换浏览器！")
            }
            return data
        }

        /**
         * 页面右上角按钮组
         * topbars: [array <object>]
         *  id: 按钮id  [string] 可空
         * 	icon: 按钮图标	[string]
         *  name: 按钮名称  [string]
         *  callback: 按钮绑定的事件函数
         *  params: 按钮事件函数的参数
         *  disabled: 默认false
         *  event: 默认click
         */
        bb.toolbar = function (params) {
            //新建实例
            var toolbar = {}
            //设置默认值
            var defaultsTopbar = {
                "event": "click",
                "disabled": false,
            }
            //处理初始化参数
            if (params) {
                for (var i = 0; i < params.length; i++) {
                    params[i] = $.extend({}, defaultsTopbar, params[i])
                }
                $("#topbar").data("params", params)
            } else {
                //使用默认值
                var params = $("#topbar").data("params")
            }
            //初始化的构造代码片段；
            $navbar.topbar(params)
            $("#topbar li").each(function (i) {
                $("#topbar li").eq(i).unbind(params[i].event)
                $("#topbar li").eq(i).data({ "params": params[i].params })
                $("#topbar li").eq(i).bind(params[i].event, params[i].callback)
            })
            //对外开放API；
            toolbar.refresh = function (start, length, params1) {
                _refresh(start, length, params)
            }
            //本地私有方法
            var _refresh = function (start, length, params1) { }
            //返回实例
            return toolbar
        }

        /**
         * localStorage剩余空间百分比
         */
        bb.getLocalStorageSpaceFree = function () {
            var sizeStore = 0
            // 遍历所有存储
            if (localStorage) {
                for (var key in localStorage) {
                    if (localStorage.hasOwnProperty(key)) {
                        sizeStore += localStorage.getItem(key).length
                    }
                }
            }
            var spaceUsed = sizeStore / 1024 / 1024
            var spaceTotal = 5
            var spaceFreePercentage = ((1 - spaceUsed / spaceTotal) * 100).toFixed(2) + "%"
            return spaceFreePercentage
        }

        /******************** begin page ********************/
        /**
         * 翻页组件
         * 	1、bb.page.init(options);
         *  参数：options [object]
         * 	 		pagesAll 总页数 			[num]
         *    		page 当前页数				[num]
         *     		id 添加到id里，domId		[num]
         * 		    params 回调函数的参数		[不确定]
         * 		    callback 回调函数           [function]
         */
        bb.page = $page
        /******************** end simple ********************/

        /******************** begin simple ********************/
        /**
         * 简单方法:
         * 1、bb.simple.random;
         * 		生成n位随机数(默认8位随机数)
         *   	@param  {[num]} n [生成随机数的位数]
         *      @return {[num]}   [生成的随机数]
         * 2、bb.simple.formatAge;
         * 		格式化年龄
         * 		入参 总天数 days
         * 		1、小于三个月的显示几周几天，(days<3*30)
         * 		2、小于1岁的显示几月龄几天，	(3*30<=days<1*365)
         * 		3、大于一岁的显示几岁几月龄，(1*365<=days<6*365)
         * 		4、大于六岁的只显示岁。		(days>=6*365)
         * 3、bb.simple.dateDiff;
         * 		两个日期之间的差 (date2 - date1)
         * 		@param  {[type]} date1 [日期1]
         * 		@param  {[type]} date2 [日期2]
         * 		@return {[object]}       [返回一个对象, object.days是天数; object.age是格式化后的年龄]
         * 4、bb.simple.getGestation;
         * 		根据出生日期、预产期计算孕周
         * 		@param  {[type]} date1 [出生日期]
         * 		@param  {[type]} date2 [预产期]
         * 		@return {[object]}       [返回一个对象, object.days是天数; object.age是格式化后的孕周]
         * 5、bb.simple.getDateFormat;
         * 		获取时间（时间格式：xxxx-xx-xx）,根据日期对象
         * 		@param  {[type]} date [日期对象]
         * 		@return {[object]}  [返回一个对象, object.date如2018-02-03; object.locale如2018-02-03 12::03:03]
         * 6、bb.simple.getCurTime;
         * 		获取当前时间
         * 		@return {[object]}  [返回一个对象, object.date如2018-02-03; object.locale如2018-02-03 12::03:03]
         * 7、bb.simple.getDecimalPlaces;
         * 		获取数字保留小数的位数
         */
        bb.simple = $simple
        /******************** end simple ********************/

        /******************** begin print ********************/
        /**
         * 打印组件
         * 	1、bb.print.init(options);
         *  参数：options [object]
         *        id：			dom元素的id
         *        tmpId：		打印模板id
         *        data：       答案
         */
        bb.print = $print
        /******************** end print ********************/

        /******************** begin code ********************/
        /**
         * 前端页面里面写死的deCode和innDeCode。
         *  1、bb.code.getDeCodes();               // 获取所有deCode
         *  2、bb.code.getDeCodeByName(name);      // 根据自定义的name获取deCode
         *  3、bb.code.getDeCodeNameByName(name);  // 根据自定义的name获取deCode转化的name(即.替换为_)
         *  4、bb.code.getValueByName(domId,name); // 根据自定义的name获取对应的值(domId:包裹form表单的dom元素的id)
         */
        bb.code = $code
        /******************** end code ********************/

        return bb
    })
